图：元素之间存在多对多关系（线性表的元素之间存在前驱和后继，树的元素之间存在父子关系，图的任意元素之间都有可能存在关系）。
    由顶点的有穷非空集合和顶点之间边的集合组成。
    在图型数据结构中，数据被称为顶点，数据之间的关系补称为边。
    在图中不允许出现没有点，但可以没有边。
    G(V,E),V表示顶点，E表示边的集合。
各种图的定义：
    无向图：顶点与顶点之间没有方向，这种边称为无向边，边用无向序偶对表示(v,v1)。
    V={A,B,C,D} E={(A,B),(B,C),(C,D),(D,A)}
    在无向图中，如果任意两个顶点之间都存在边，这种图称为无向完全图,那这种图的边为n*(n-1)/2。

    有向图：若顶点之间有方向，这种边称为有向边，也叫弧，用有序偶对表示<v,v1>,v1叫做弧头，v叫做弧尾。
    注意：若不存在顶点到自身和边，也不存在重复出现的边这种图叫做简单图，数据结构课程中讨论的都是简单图，数据结构课程中讨论的都是简单图。
    
    在有向图中如果任意两个顶点之间存在方向相反的两条弧，这种图叫做有向完全图。

    图中有很少边或弧的图叫做稀疏图，反之叫做稠密图。

    如果图中的边或弧有相关的数据，数据称为权，这种图也叫做网（带权图）。
    如果G(v,E)和G1(v1,E1),存在v1∈V,且E1∈E,那么G1是G的子图。

顶点与边的关系
    顶点的度：指的是顶点相关联的边或弧的条目数。
        有向图又分为出度和入度。
        入度：其他顶点到该顶点的弧的条目数。
        出度：从该点出发到其他顶点的弧的条目数。
        顶点序列：从一个顶点到另一个顶点的路径，路径长度指的是路径上的边或弧的条目数。

连通图相关术语：
    在无向图中，在顶点v到v1之间有路径，则称v到v1之间是连通的，如果任意两个顶点都是连通的，那么这种图称为连通图。
    无向图中的极大连通子图称为连通分量：
        1、必须是子图
        2、子图必须是连通的
        3、连通子图含有极大的顶点数
    在有向图中，任意顶点之间都存在路径，这种图叫做强连通图。
    有向图中的极大连通子图称为有向的强连通分量。
    在有向图中如果有一个顶点的入度为0，其他顶点的入度均为1，则是一颗有向树。

图的存储结构：
    图的存储主要是两个方面：顶点，边
    邻接矩阵：
        一个一维数组（顶点）和一个二维数组（边，弧）组成。
        二维数组i,i位置都是0，如果是无向图则数组对称（左上到右下对称）。
        优点：
            1、非常容易判定两顶点之间是否有边
            2、非常容易计算任意顶点的入度和出度。
            3、非常容易统计邻接点
        缺点：如果存储稀疏图，会非常浪费存储空间
    邻接表：
        由顶点表                   边表组成。
        顶点  下一个邻接点地址      顶点下标|下一个邻接点地址      
        A     ->                   [1] -> [3] -> NULL
        B     ->                   [2] -> NULL
        C     ->                   [4] -> [3] -> NULL
        D     ->                   
        E     ->                   
        优点：
            1、节省存储空间
            2、非常容易计算出度
        缺点：不方便计算入度
    十字链表：由于邻接表不能同时兼顾出度和入度，因此我们修改邻接的边表结构，使用即存储入度也存储出度，这种表就叫做十字链表。
    邻接多重表：由于遍历表时需要一些删除边操作而邻接表在删除边时非常麻烦，因此就设计出了邻接多重表
    边集数组：由两个一维数组构成，一个存储顶点的消息，另一个存储边的信息（它的每个数据元素都由一条边的起点到终点的下标和权组成），
这种存储结构更侧重于边的相关操作（路径、路径长度、最短路径），而统计顶点的度需要扫描整个数组，效率不高。

图的遍历：
    注意：图的遍历结果无论是深度优先还是广度优先，结果都不唯一
    深度优先：类似树的前序遍历。
    广度优先：类似树的层序遍历（需要借助队列）